/**
 * Copyright &copy; 2017 <a href="https://gitee.com/hackempire/emsite-parent">emsite</a> All rights reserved.
 */
package com.empire.emsite.common.persistence.interceptor;

import java.io.Serializable;
import java.util.Properties;

import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.apache.ibatis.plugin.Interceptor;

import com.empire.emsite.common.persistence.Page;
import com.empire.emsite.common.persistence.dialect.Dialect;
import com.empire.emsite.common.persistence.dialect.db.DB2Dialect;
import com.empire.emsite.common.persistence.dialect.db.DerbyDialect;
import com.empire.emsite.common.persistence.dialect.db.H2Dialect;
import com.empire.emsite.common.persistence.dialect.db.HSQLDialect;
import com.empire.emsite.common.persistence.dialect.db.MySQLDialect;
import com.empire.emsite.common.persistence.dialect.db.OracleDialect;
import com.empire.emsite.common.persistence.dialect.db.PostgreSQLDialect;
import com.empire.emsite.common.persistence.dialect.db.SQLServer2005Dialect;
import com.empire.emsite.common.persistence.dialect.db.SybaseDialect;
import com.empire.emsite.common.utils.Reflections;

/**
 * 类BaseInterceptor.java的实现描述：Mybatis分页拦截器基类
 * 
 * @author arron 2017年10月30日 下午4:01:18
 */
public abstract class BaseInterceptor implements Interceptor, Serializable {

    private static final long     serialVersionUID = 1L;

    protected static final String PAGE             = "page";

    protected static final String DELEGATE         = "delegate";

    protected static final String MAPPED_STATEMENT = "mappedStatement";

    protected Log                 log              = LogFactory.getLog(this.getClass());

    protected Dialect             DIALECT;

    protected String              dbType;

    //    /**
    //     * 拦截的ID，在mapper中的id，可以匹配正则
    //     */
    //    protected String _SQL_PATTERN = "";

    /**
     * 对参数进行转换和检查
     * 
     * @param parameterObject 参数对象
     * @param page 分页对象
     * @return 分页对象
     * @throws NoSuchFieldException 无法找到参数
     */
    @SuppressWarnings("unchecked")
    protected static Page<Object> convertParameter(Object parameterObject, Page<Object> page) {
        try {
            if (parameterObject instanceof Page) {
                return (Page<Object>) parameterObject;
            } else {
                return (Page<Object>) Reflections.getFieldValue(parameterObject, PAGE);
            }
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 设置属性，支持自定义方言类和制定数据库的方式 <code>dialectClass</code>,自定义方言类。可以不配置这项
     * <ode>dbms</ode> 数据库类型，插件支持的数据库 <code>sqlPattern</code> 需要拦截的SQL ID
     * 
     * @param p 属性
     */
    protected void initProperties(Properties p) {
        Dialect dialect = null;
        //String dbType = Global.getJdbcType();
        dbType = p.getProperty("dbType");
        if ("db2".equals(dbType)) {
            dialect = new DB2Dialect();
        } else if ("derby".equals(dbType)) {
            dialect = new DerbyDialect();
        } else if ("h2".equals(dbType)) {
            dialect = new H2Dialect();
        } else if ("hsql".equals(dbType)) {
            dialect = new HSQLDialect();
        } else if ("mysql".equals(dbType)) {
            dialect = new MySQLDialect();
        } else if ("oracle".equals(dbType)) {
            dialect = new OracleDialect();
        } else if ("postgre".equals(dbType)) {
            dialect = new PostgreSQLDialect();
        } else if ("mssql".equals(dbType) || "sqlserver".equals(dbType)) {
            dialect = new SQLServer2005Dialect();
        } else if ("sybase".equals(dbType)) {
            dialect = new SybaseDialect();
        }
        if (dialect == null) {
            throw new RuntimeException("mybatis dialect error.");
        }
        DIALECT = dialect;
        //        _SQL_PATTERN = p.getProperty("sqlPattern");
        //        _SQL_PATTERN = Global.getConfig("mybatis.pagePattern");
        //        if (StringUtils.isEmpty(_SQL_PATTERN)) {
        //            throw new RuntimeException("sqlPattern property is not found!");
        //        }
    }
}
